package dao

import (
	"fmt"
	"gorm.io/gorm"
	"log"
	"lottery/models"
)

type CodeDao struct {
	engine *gorm.DB
}

// 公共方法，实例化方法
func NewCodeDao(engine *gorm.DB) *CodeDao {
	return &CodeDao{
		engine: engine,
	}
}

// 查找单一值
func (d *CodeDao) Get(id int) (*models.LtCode, bool) {
	data := &models.LtCode{}
	// 查询数据
	err := d.engine.First(&data, id).Error
	if err != nil { // 未获取到，得到的是空对象
		return data, false
	}
	return data, true
}

// 查找全部: 进行分页
func (d *CodeDao) GetAll(page, size int) ([]models.LtCode, bool) {
	// 计算偏移量
	offset := (page - 1) * size
	datalist := make([]models.LtCode, 0)
	// 返回所有数据，按照状态和 删除
	err := d.engine.Order("id desc").Limit(size).Offset(offset).
		Find(&datalist).Error
	if err != nil { // 错误了，写个日志
		log.Println("gift_dao.GetAll error = ", err.Error())
		return datalist, false
	}
	return datalist, true
}

// 查找总数
func (d *CodeDao) CountAll() int64 {
	var num int64
	d.engine.Table("lt_codes").Count(&num)
	return num
}

func (d *CodeDao) CountByGift(giftId int) int64 {
	var num int64
	_ = d.engine.Model(&models.LtCode{}).Where("gift_id = ?", giftId).Count(&num)
	return num
}

// 查找单一
func (d *CodeDao) Search(giftId, page, size int) []models.LtCode {
	// 计算偏移量
	offset := (page - 1) * size
	datalist := make([]models.LtCode, 0)
	_ = d.engine.Where(&models.LtCode{GiftId: giftId}).Order("id desc").Limit(size).Offset(offset).Find(&datalist)
	return datalist
}

// 获取可用的优惠券数量
func (d *CodeDao) SearchAvailableCodeCount(giftId int) int {
	var count int
	err := d.engine.Raw("select count(*) from lt_codes where sys_status = 0").Scan(&count).Error
	if err != nil {
		fmt.Println("err = ", err)
	}
	return count
}

// 删除操作不做物理删除， 逻辑删除，更新字段
func (d *CodeDao) Delete(id int) error {
	data := &models.LtCode{Id: id}
	err := d.engine.Model(&data).
		Update("sys_status", 1).Error

	return err
}

// 更新操作: 针对传入的指定 columns，字段名，进行查询
func (d *CodeDao) Update(data *models.LtCode, columns []string) error {
	err := d.engine.Model(data).Select(columns).Updates(data).Error
	return err
}

// 执行创建操作
func (d *CodeDao) Create(data *models.LtCode) error {
	err := d.engine.Create(data).Error
	return err
}

// 查找下一个可用的编码
// codeId: 上一次的code值
func (d *CodeDao) NextUsingCode(giftId, codeId int) *models.LtCode {
	datalist := make([]models.LtCode, 0)
	err := d.engine.Where("gift_id = ?", giftId).
		Where("sys_status = ?", 0). // 有效的奖品
		Where("id > ? ", codeId).
		Order("id").Limit(1).
		Find(&datalist).Error
	if err != nil || len(datalist) < 1 {
		return nil
	} else {
		return &datalist[0]
	}
}

// 根据唯一的code来更新
func (d *CodeDao) UpdateByCode(data *models.LtCode, columns []string) error {
	err := d.engine.Where("code=?", data.Code).
		Select(columns).Updates(data).Error
	return err
}
